pub mod base32_rfc4648;
pub mod const_assert;
pub(crate) mod region_store;
pub(crate) mod shape;

#[inline(always)]
pub const fn chunk_dim_const<const CBITS: u8>() -> u32 {
    1u32 << CBITS
}

#[inline(always)]
pub const fn halo_dim_const<const CBITS: u8>() -> u32 {
    chunk_dim_const::<CBITS>() + 2
}

#[inline]
pub fn floor_div_i32(a: i32, m: i32) -> i32 {
    // 数学上的 floor(a / m) ，对负数也正确
    // Rust 的 `/` 是向零截断，所以要修正
    if (a >= 0) || (a % m == 0) {
        a / m
    } else {
        // a < 0 且不能整除
        (a / m) - 1
    }
}

#[inline]
pub fn floor_mod_i32(a: i32, m: i32) -> i32 {
    // 数学上的 a mod m ，范围 [0, m)
    let r = a % m;
    if r < 0 { r + m } else { r }
}
